from sys import prefix
from types import resolve_bases
from typing_extensions import runtime
from flask import Blueprint,request,jsonify,redirect
import requests
from requests.api import get
from utils.db import db
from utils.comm import get_data
import time


bp_weibo = Blueprint('weibo',__name__)






@bp_weibo.route('/weiboCallback/')
def weiboCallback():
    code = request.args.get('code')
    #微博认证地址
    access_token_url = "https://api.weibo.com/oauth2/access_token"
    #参数
    response = requests.post(access_token_url,data={
        "client_id": '3648830690',
        "client_secret": "916d80b477ccffce5d70e63b02bb1092",
        "grant_type": "authorization_code",
        "code": code,
        "redirect_uri": "http://127.0.0.1:8000/users/weiboCallback/",
    })
    #因为用的requests  需要文本展示  eval可以转换任何字符串格式
    res = eval(str(response.text))
    # print(res)
    # print(res['uid'])
    #认证结束后 获取微博给的token 和uid
    
    try:
        uid = res['uid']
        token = res['access_token']
        
    except:
    #如果没有uid 跳转一个页面 类似 网页跑丢了
        uid = 0
        return redirect('http://localhost:8888/error')
    #有了uid 可以查看大用户在sf_login身份表中有无信息用到链表查询名字 有就登录 没有要绑定 相当于注册
    sql = "select u.id,u.nikename from sf_login as sf inner join users as u on sf.user_id=u.id where uid=%d"%int(uid)
    ress = db.find_one(sql)
    #如果有信息就直接拿token登录 没有要代表没注册过需要绑定注册一个信息 type=1代表已经授权过了
    if ress:
        return redirect("http://localhost:8888/bindmobile/?type=1"+'&id='+str(ress['id'])+'$name='+ress['nikename'])
    else:
        #type = 2代表授权了但是用户不在sf——login身份表中 需要注册 这个时候需要uid，token，webfrom（那个网站这边是新浪）
        return redirect("http://localhost:8888/bindmobile/?type=1"+'&uid='+str(uid)+'$token='+token)


@bp_weibo.route('/bindMobile/',methods=['POST','GET'])
def bindMobile():
    if request.method == 'POST':
        #绑定uid  token mobile
        data = get_data()
        #根据手机号查看邮箱是否绑定
        sql = "select id from sf_login where email='%s'"%data['mobile']
        res = db.find_one()
        if res:
            return jsonify({"code":10010,'mas':'邮箱已存在,不能再次绑定'})
        else:
            #现在用户表里注册信息
            sql = "insert into users(`email`) values('%s')"%data['mobile']
            db.insert(sql)
            #查询新注册的email 的id 构造身份表
            sql1 = "select id form users wherer email='%s'"%(data['meobile'])
            user = db.find_one(sql1)
            #添加到三方表里
            sql2= "insert into sf_login(`user_id`,`platfrom`,`uid`,`token`) values(%d,'weibo',%d,'%s')"%(int(user['id']),int(data['uid']),data['token'])
            db.insert(sql2)
            return jsonify({'code':200,'id':user['id'],'name':data['mobile']})

    else:
        pass


#训练营
@bp_weibo.route('/active/',methods=['POST','GET'])
def aactive():
    if request.method == "POST":
        data = get_data()
        #先看用户有没有参加过活动 在用户记录表查看
        sql  = "select * from actrecord where mobile='%s' and active_id=%d"%(data['mobile'],int(data['active_id']))
        res = db.find_one(sql)
        
        if res:
            return jsonify({"code":200,'mas':'您已经参加过该次活动'})
        #没参加过 在用户表查看有没有该用户 没用户就是没权限参加有 就按等级收费
        sql1 = "select * from users where nikename='%s'"%(data['mobile'])
        res1 = db.find_one(sql1)


        #活动信息
        sql2 = "select * from active where id=%d"%int(data['active_id'])
        res2 = db.find_one(sql2)
        if res1:
            #有用户  根据等级判断什么用户 最后收费还是不收费
            if res1['level'] == 3:  #vvip用户
                sql = "insert into actrecord(`mobile`,`active_id`,`type`,`spayment`,`price`) values('%s',%d,1,1,%d)"%(data['mobile'],int(data['active_id']),float(data['price']))
                
                db.insert(sql)
                
                #活动人数减一
                if res2['rpeople']>=1:
                    count  = int(res2['rpeople']) -1
                    #修改数据
                    sql = "update active set rpeople=%d where id=%d"%(count,int(data['active_id']))
                    db.update(sql)
                return jsonify({"code":200})

            else:
                #有信息 但是等级不是level=3 无权参加
                return jsonify({"code":10011,'mes':'您无权参与此活动'})
        else:
            #没有用户 说明新用户 生成订单交钱参加
            #先添加新用户
            sql = "insert into actrecord(`mobile`,`active_id`,`type`,`spayment`,`price`) values('%s',%d,2,0,%d)"%(data['mobile'],int(data['active_id']),float(data['price']))
            db.insert(sql)
            #查询新用户加进去没 前端跳支付页面 这边查询返回价格和订单的id 后期修改订单状态用
            sql2  = "select * from actrecord where mobile='%s' and active_id=%d"%(data['mobile'],int(data['active_id']))
            res2 = db.find_one(sql2)

            return jsonify({"code":200,'order_id':res2['id'],'money':res2['price']})
            
        

    else:
        sql = "select id,title,price from active"
        res = db.find_all(sql)
        return jsonify({'code':200,'list':res})


#测试支付宝
import datetime
from utils.comm import  get_ali_object
@bp_weibo.route('/pay/')
def pay():

        #获取数据
        order_id = request.args.get('id')
        #查询价格和
        sql = "select * from actrecord where id=%d" %(int(order_id))

        res = db.find_one(sql)

        alipay = get_ali_object()
        # 生成支付的url
        query_params = alipay.direct_pay(
            subject="test",  # 商品简单描述
            out_trade_no=str(order_id)+str(datetime.datetime.now().strftime("%Y%M%D")),  # 用户购买的商品订单号（每次不一样） 20180301073422891
            total_amount=int(res['price']),  # 交易金额(单位: 元 保留俩位小数)
        )
        pay_url = "https://openapi.alipaydev.com/gateway.do?{0}".format(query_params)  # 支付宝网关地址（沙箱应用）
        return redirect(pay_url)
